package cn.edu.hust.cm.lib;

/**
 * 在Arrays已有静态方法的基础上增加某些有用的静态工具方法
 * 
 * @author 陈明
 * 
 */
public class ArraysExt {

	static boolean isSorted(int[] array, int sign) {
		if (null == array) {
			throw new NullPointerException("array is null");
		}
		if (0 == sign) {
			throw new IllegalArgumentException("sign cannot be zero!");
		}

		if (0 == array.length) {
			return false;
		}

		if (1 == array.length) {
			return true;
		}

		if (sign > 0) {
			for (int i = 1; i < array.length; i++) {
				if (array[i] < array[i - 1]) {
					return false;
				}
			}
		} else if (sign < 0) {
			for (int i = 1; i < array.length; i++) {
				if (array[i] > array[i - 1]) {
					return false;
				}
			}
		} else {
			throw new IllegalArgumentException("sign cannot be zero!");
		}

		return true;
	}

	/**
	 * 检查一个整形数组中各元素是否按升序排列. 有以下规定: array为空数组时, 认为不是按升序排列; array仅有一个元素时, 认为是按升序排列
	 * 
	 * @param array
	 *            待检查的数组
	 * @return 如果整形数组升序排列, 返回true; 否则返回false
	 * @throws IllegalArgumentException
	 *             array为null
	 */
	public static boolean isAsc(int[] array) {
		return isSorted(array, 1);
	}

	/**
	 * 检查一个整形数组中各元素是否按逆序排列. 有以下规定: array为空数组时, 认为不是按逆序排列; array仅有一个元素时, 认为是按逆序排列
	 * 
	 * @param array
	 *            待检查的数组
	 * @return 如果整形数组逆序排列, 返回true; 否则返回false
	 */
	public static boolean isDesc(int[] array) {
		return isSorted(array, -1);
	}

	static boolean isSorted(Comparable[] array, int flag) {
		
		return false;
	}
	
	public static void main(String[] args) {
		class A implements Comparable<A> {
			int id;
			
			A(int id) {
				super();
				this.id = id;
			}

			@Override
			public int compareTo(A o) {
				return id - o.id;
			}
			
		}
		
		Integer[] ns = {1, 2, 3};
		System.out.println(isSorted(ns, 1));

		A[] as = {new A(1), new A(2)};
		System.out.println(isSorted(as, 1));
	}
}
